/**
 * GcmServer
 * GcmConstants.java
 * 
 * Copyright 2013 Teachizen
 * Written by cloudstick
 *	2013. 8. 4. first written.
 *
 * note:
 * 		Copy from google gcm server implementation.
 * 		- com.google.android.gcm.server.Constants.java
 */
package com.bnsworks.server.push.gcm;

/**
 * Constants used on GCM service communication.
 */
public final class GcmConstants {

	/**
	 * Endpoint for sending messages.
	 * GCM 메시지 전송 서비스 url
	 */
	public static final String GCM_SEND_ENDPOINT = "https://android.googleapis.com/gcm/send";
	
	/**
	 * HTTP parameter for registration id.
	 * registration id 파라미터 키
	 */
	public static final String PARAM_REGISTRATION_ID = "registration_id";
	
	/**
	 * HTTP parameter for collapse key.
	 * @see http://developer.android.com/google/gcm/adv.html
	 * GCM 메시지는 기본적으로 payload 메시지를 4096bytes를 GCM 서버에 기본적으로 4주간 저장한다.
	 * collapsed 정책은 두 가지 메시지 전송 방식을 제공한다.
	 * 
	 * send-to-sync(collapsible) message
	 * - 메시지가 서버에 저장되어야 하는 상황인 경우 같은 collapse_key에 대해서
	 *  저장된 메시지를 대체한다.
	 * message with payload
	 * - 현재 GCM은 non-collapsible message에 대해서 100개 까지 저장한다.
	 *  순서는 보장하지 않으며 100개의 메시지에 도달하면 모든 메시지가 삭제된다.
	 * 
	 * 저장된 메시지가 모두 전송되기를 원한다면 collapse 설정을 제거해야 한다.
	 * 꼭 non-collapsible message가 필요하지 않다면 성능을 위해 collapsible 방식이
	 * 단말의 배터리 부담을 줄인다.
	 * 
	 */
	public static final String PARAM_COLLAPSE_KEY = "collapse_key";
	
	/**
	 * HTTP parameter for delaying the message delivery if the device is idle.
	 * 메시지를 전송할 수 없는 경우의 보관 여부(default false)
	 * time_to_live와 관련
	 */
	public static final String PARAM_DELAY_WHILE_IDLE = "delay_while_idle";
	
	/**
	 * HTTP parameter for telling gcm to validate the message without actually sending it.
	 * 실제 단말로 메시지가 전송되지 않고 gcm 서버까지만 요청이 전달.
	 * 개발시 디버깅 용으로 사용(default false)
	 */
	public static final String PARAM_DRY_RUN = "dry_run";
	
	/**
	 * HTTP parameter for package name that can be used to restrict message delivery by matching
	 * against the package name used to generate the registration id.
	 * 옵션 항목
	 */
	public static final String PARAM_RESTRICTED_PACKAGE_NAME = "restricted_package_name";
	
	/**
	 * Prefix to HTTP parameter used to pass key-values in the message payload.
	 * 실제 전송 메시지. 4096byte까지 가능 
	 */
	public static final String PARAM_PAYLOAD_PREFIX = "data.";

	/**
	 * Prefix to HTTP parameter used to set the message time-to-live.
	 * delay_while_idle이 true인 경우 gcm서버에 메시지가 저장되는 초(기본 4주)
	 */
	public static final String PARAM_TIME_TO_LIVE = "time_to_live";

	/**
	 * Too many messages sent by the sender. Retry after a while.
	 * 너무 많은 메시지를 보냈을 때 발생. 잠시 후 재시도
	 */
	public static final String ERROR_QUOTA_EXCEEDED = "QuotaExceeded";

	/**
	 * Too many messages sent by the sender to a specific device.
	 * Retry after a while.
	 * 특정 단말에 너무 많은 메시지를 보냈을 때 발생.
	 * 잠시 후 재시도
	 */
	public static final String ERROR_DEVICE_QUOTA_EXCEEDED = "DeviceQuotaExceeded";

	/**
	 * Missing registration_id.
	 * Sender should always add the registration_id to the request.
	 * rid를 추가하지 않고 요청했을 때 발생
	 */
	public static final String ERROR_MISSING_REGISTRATION = "MissingRegistration";

	/**
	 * Bad registration_id. Sender should remove this registration_id.
	 * 잘못된 rid. sender는 해당 rid를 삭제해야 한다.
	 */
	public static final String ERROR_INVALID_REGISTRATION = "InvalidRegistration";

	/**
	 * The sender_id contained in the registration_id does not match the
	 * sender_id used to register with the GCM servers.
	 * rid에 포함되어 있는 sender id가 매치되지 않는 경우
	 */
	public static final String ERROR_MISMATCH_SENDER_ID = "MismatchSenderId";

	/**
	 * The user has uninstalled the application or turned off notifications.
	 * Sender should stop sending messages to this device and delete the
	 * registration_id. The client needs to re-register with the GCM servers to
	 * receive notifications again.
	 * 단말 사용자가 어플리케이션을 제거 했거나 알람 설정을 꺼논 상태이다.
	 * sender는 해당 단말에 더 이상 메시지를 보내면 안되고 rid를 제거해야 한다.
	 * 클라이언트는 알람을 다시 받기 위해서 gcm 서버에 재등록을 필요로 한다.
	 */
	public static final String ERROR_NOT_REGISTERED = "NotRegistered";

	/**
	 * The payload of the message is too big, see the limitations.
	 * Reduce the size of the message.
	 * 4096byte를 초과하는 payload 메시지 전송시 발생.
	 */
	public static final String ERROR_MESSAGE_TOO_BIG = "MessageTooBig";

	/**
	 * Collapse key is required. Include collapse key in the request.
	 * collapse key가 필요한 요청에 대해 collalse key가 없는 경우 발생
	 */
	public static final String ERROR_MISSING_COLLAPSE_KEY = "MissingCollapseKey";

	/**
	 * A particular message could not be sent because the GCM servers were not
	 * available. Used only on JSON requests, as in plain text requests
	 * unavailability is indicated by a 503 response.
	 * 각각의 전송 메시지에 대해서 gcm이 사용 불가 상태일 수 있다. json 요청에 대해서만 발생하며
	 * 일반 호출에 대해서는 503 상태 코드로 나타낸다.
	 */
	public static final String ERROR_UNAVAILABLE = "Unavailable";

	/**
	 * A particular message could not be sent because the GCM servers encountered
	 * an error. Used only on JSON requests, as in plain text requests internal
	 * errors are indicated by a 500 response.
	 * 각각의 전송 메시지에 대해서 gcm이 오류가 발생할 수 있다. json 요청에 대해서만 발생하며
	 * 일반 호출에 대해서는 500 상태 코드로 나타낸다.
	 */
	public static final String ERROR_INTERNAL_SERVER_ERROR = "InternalServerError";

	/**
	 * Time to Live value passed is less than zero or more than maximum.
	 * ttl 값이 0 보다 작거나 maximum(4주)보다 큰 경우
	 */
	public static final String ERROR_INVALID_TTL= "InvalidTtl";

	/**
	 * Token returned by GCM when a message was successfully sent.
	 * 성공 시 리턴되는 token id
	 */
	public static final String TOKEN_MESSAGE_ID = "id";

	/**
	 * Token returned by GCM when the requested registration id has a canonical
	 * value.
	 * 하나의 단말에 registration id가 중복해서 발급되는 경우, 해당 단말에 메시지를 전송하면
	 * gcm에서 canonical 아이디를 전송한다. 해당 아이디가 있는 경우 단말의 registration_id를
	 * 전송된 canonical 아이디로 대체해야 한다.
	 */
	public static final String TOKEN_CANONICAL_REG_ID = "registration_id";

	/**
	 * Token returned by GCM when there was an error sending a message.
	 * 에러 메시지를 전송하기 위한 token
	 */
	public static final String TOKEN_ERROR = "Error";

	/**
	 * JSON-only field representing the registration ids.
	 */
	public static final String JSON_REGISTRATION_IDS = "registration_ids";

	/**
	 * JSON-only field representing the payload data.
	 */
	public static final String JSON_PAYLOAD = "data";

	/**
	 * JSON-only field representing the number of successful messages.
	 */
	public static final String JSON_SUCCESS = "success";

	/**
	 * JSON-only field representing the number of failed messages.
	 */
	public static final String JSON_FAILURE = "failure";

	/**
	 * JSON-only field representing the number of messages with a canonical
	 * registration id.
	 */
	public static final String JSON_CANONICAL_IDS = "canonical_ids";

	/**
	 * JSON-only field representing the id of the multicast request.
	 */
	public static final String JSON_MULTICAST_ID = "multicast_id";

	/**
	 * JSON-only field representing the result of each individual request.
	 */
	public static final String JSON_RESULTS = "results";

	/**
	 * JSON-only field representing the error field of an individual request.
	 */
	public static final String JSON_ERROR = "error";

	/**
	 * JSON-only field sent by GCM when a message was successfully sent.
	 */
	public static final String JSON_MESSAGE_ID = "message_id";

	private GcmConstants() {
		throw new UnsupportedOperationException();
	}
}